iT邦幫忙

2024 iThome 鐵人賽

DAY 24
1
Modern Web

Go 快 Go 高效: 從基礎語法到現代Web應用開發系列 第 24

【Day24】即時串流通信服務 I | gRPC 簡介

  • 分享至 

  • xImage
  •  

RPC(遠程過程調用,Remote Procedure Call)

RPC 是一種讓程式能夠像調用本地函數一樣,調用位於遠端服務器上的函數或方法的技術。它的主要目的是簡化分布式系統的開發,讓開發者無需關注底層的網絡通信細節。

gRPC 介紹

gRPC(gRPC Remote Procedure Calls)是一個高性能、開源的遠程過程調用(RPC)框架,由 Google 開發並於 2015 年開源。gRPC 基於 HTTP/2 協議,並使用 Protocol Buffers(Protobuf)作為接口描述語言(IDL)和消息交換格式。由於其高效、靈活和多語言支持,gRPC 已成為現代微服務架構中常用的通信解決方案。

RPC vs gRPC: 主要差異

在比較傳統的 RPC 與 gRPC 時,主要的差異體現在訊息格式、效能、傳輸協定等多個方面。以下是兩者的關鍵區別:

功能 RPC gRPC
訊息格式 通常使用 JSON 或 XML 等基於文字的格式進行訊息序列化 使用 Protocol Buffers(protobuf)這種二進位格式
效能 基於文字的格式通常效能較低,延遲較高 二進位格式更適合網路傳輸,實現更低的延遲和更好的效能
機器可讀性 較低,需要額外工具解析文字格式 Protocol Buffers 訊息是嚴謹可讀的,工具更容易解析和理解交換的訊息
傳輸協定 可以使用多種傳輸協定,包括 HTTP/1.1、TCP 專門使用 HTTP/2
多路復用 (Multiplexing) 不支援或支援有限 允許在單一連線上多路復用多個請求,減少開銷並提高效能
流量控制 (Flow Control) 不支援或支援有限 提供更好的流量控制機制,管理資料傳輸,防止擁塞並提高回應能力
速度 基於 HTTP/1.1 的 REST 通常較慢 基於 HTTP/2 的 gRPC 比 HTTP/1.1 的 REST 更快,且效率更高
截止日期/逾時 (Deadlines/Timeouts) 通常需自行實現 內建支援,確保請求不會掛起,並自動處理解決逾時、網路問題等
生態系 (Ecosystem) 支援有限,需依賴第三方工具 支援豐富,包括自動負載均衡、錯誤處理、負載平衡等功能
Streaming Support 通常僅支援請求-響應式通訊 支援串流-響應和雙向串流,適合即時應用程式
程式語言支援 支援多種程式語言,如 Java、Python、C++、Go 等 擁有更豐富的語言支援生態系,特別是對 Go 和 Rust 等較新的語言
Client-Server 耦合性
使用場景 一般 Web API、CRUD 操作 高效能及低延遲系統、大數據傳輸、用於客戶端和伺服器端之間的即時或串流應用

gRPC 工作原理

gRPC 的工作流程通常包括以下幾個步驟:

  1. 定義服務:
    • 使用 Protobuf 編寫 .proto 文件,定義服務接口及其方法和消息結構。
  2. 生成代碼:
    • 通過 Protobuf 編譯器(protoc)生成相應語言的客戶端和服務端代碼。
  3. 實現服務:
    • 在服務端實現生成的接口方法,處理客戶端的請求並返回結果。
  4. 調用服務:
    • 在客戶端使用生成的 stub 調用服務端的方法,gRPC 框架負責處理底層的通信細節。

gRPC 通訊流程

https://ithelp.ithome.com.tw/upload/images/20241002/201618505DfwxjPxDN.png

gRPC 核心組件

  • gRPC Stub

    • 客戶端並不是直接與伺服器溝通,而是透過稱為 gRPC Stub 的代理對象。Stub 負責將客戶端的請求轉換為伺服器能理解的形式。
    • 這個 Stub 是自動從 Proto 檔案生成的,了解如何處理請求和回應。
  • Protocol Buffer(協定緩衝區)

    • Protocol Buffers 是 gRPC 用來編碼和解碼資料的工具,將資料轉換成高效的二進制格式(Binary),節省網路流量並加速通訊過程。
    • 當客戶端發送請求時,資料會被 Protocol Buffers 編碼,傳送給伺服器;伺服器回應時,資料也會先被 Protocol Buffers 編碼。
  • Proto 檔案

    • 這是一個定義檔,裡面定義了服務(service)和訊息格式。
    • Proto 檔案定義了所有的通訊規則,像是客戶端要傳送什麼樣的資料,伺服器要回傳什麼資料。

gRPC 通訊流程

  1. 客戶端請求(Client Request):
    • 客戶端應用程式透過呼叫存根物件上的方法來發起 RPC 呼叫。
  2. 存根到通道(Stub to Channel):
    • Stub 將請求參數序列化為 Protobuf 訊息,並透過已建立的通道將其傳送到伺服器。
  3. 伺服器接收(Server Reception):
    • 伺服器接收 Protobuf 訊息並將其解碼為結構化資料。
  4. 方法執行(Method Execution):
    • 伺服器執行對應的方法,呼叫服務實作中定義的業務邏輯。
  5. 回應產生(Response Generation):
    • 伺服器將回應資料編碼為 Protobuf 訊息。
  6. 通道到存根(Channel to Stub):
    • 伺服器將產生的 Protobuf 訊息透過通道傳送回客戶端 Stub。
  7. 存根到客戶端(Stub to Client):
    • Stub 對回應訊息進行解碼,並將反序列化的回應資料傳回客戶端應用程式。

服務比較

功能 GraphQL REST gRPC
資料格式 JSON JSON、XML 等(基於文本) Protocol Buffers(Binary)
協議 HTTP/1.1 或 HTTP/2 HTTP/1.1 或 HTTP/2 HTTP/2
瀏覽器支援 適用於所有瀏覽器 適用於所有瀏覽器 支援有限
資料獲取 客戶端指定所需的精確資料 客戶端通過預定義的端點獲取資料 客戶端指定所需的精確資料
API 合約 強型別、基於查詢 鬆散,依賴文檔 強型別,基於 Schema
版本控制 通常無版本控制,通過 Schema 演進 URL、標頭、版本化的媒體類型 通過訊息類型或字段進行版本控制
學習曲線 中等 簡單 簡單
實時支援 有限的實時能力(需要訂閱) 有限的實時能力(需要 WebSocket) 支援雙向流
錯誤處理 錯誤對象嵌在成功回應中 HTTP 狀態碼,自定義回應 通過 gRPC 狀態碼標準化
Client-Server 耦合性
程式碼產生 通過 GraphQL 工具自動生成 第三方工具 (如:Swagger) 原生 Protobuf 編譯器
通訊方式 1 to 1 1 to 1 1 to 1/1 to M/M to 1/M to M
雙向串流
API 呼叫方式 使用 GraphQL 查詢語言呼叫 使用對應 HTTP Method 呼叫 Endpoint URL 像是呼叫 Function 一樣
Response 格式定義 定義在 GraphQL Schema 由 Server 定義 (通常為 JSON) 定義在 proto 檔案內
使用場景 複雜查詢、移動應用 API、需要靈活的資料獲取的應用 一般 Web API、CRUD 操作 高效能及低延遲系統、大數據負載、用於客戶端和伺服器端之間的即時或串流應用

結語

gRPC 是一個輕量級且高效的資料擷取系統,其核心優勢在於合約描述的方式。與傳統架構不同,gRPC 強調合約的重要性,而非架構本身在協商中的主導地位。這意味著伺服器與客戶端之間的互動主要依賴於預先定義的合約,而非架構設計的靈活性。
在 gRPC 中,雖然資料處理和計算由遠端伺服器負責,但大部分的運算負荷卻由客戶端承擔。這種設計使得客戶端能夠以較低的資源消耗進行高效的資料傳輸和處理。
因此 gRPC 成為延遲敏感和高吞吐量應用程式的更好選擇。


延伸閱讀


上一篇
【Day23】動態型結構 | 透過 reflect 提升 Golang 靈活性
下一篇
【Day25】即時串流通信服務 II | 在 Golang 中開發 gRPC 服務
系列文
Go 快 Go 高效: 從基礎語法到現代Web應用開發27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言